/**
 * Ajax 方法
 * options : {
 *     url : 请求地址 必需
 *     method : 请求类型 GET 或 POST 默认POST
 *     async : 是否异步 true 或 false 默认true
 *     data : 请求参数键值对 Object 默认null
 *     success : 请求成功回调函数 Function 默认null 返回请求成功的文本内容
 *     error : 请求失败回调函数 Function 默认null 返回请求失败的状态码
 * }
 */

function Ajax(options) {
    var url,
        method,
        async,
        data,
        success,
        error;
    if (typeof options == "string") {
        //如果传入的options 是一个字符串，就把它认为是请求地址，其它参数使用默认值
        console.log("你传入了一个URL");
    } else if (typeof options == "object") {
        //如果传入的options是一个对象，则开始解析对象内的各个参数
        //如果该参数不存在，则使用默认值
        url = options.url;
        method = options.method ? options.mehtod : "POST";
        async = options.async ? options.async : true;
        data = options.data ? options.data : null;
        success = options.success ? options.success : null;
        error = options.error ? options.error : null;
    } else {
        //如果options非对象 非字符串  则提示并返回
        alert("你传入参数错误，请检查!");
        return;
    }

    //创建httpRequest对象
    var xmlhttp = null;
    if (window.XMLHttpRequest) {
        //主流浏览器
        xmlhttp = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        //IE低版本浏览器
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        //浏览器不支持AJAX
        alert("你的浏览器不支持AJAX，请更换浏览器");
        return;
    }
    //{name:abc} "www.baidu.com"   "GET"
    /**
     *  如果请求方式为GET
     *  需要将请求参数 与 请求地址 拼接 并执行open() eg:www.baidu.com?name=val&...
     *  如果请求方式为POST
     *  只需要将请求参数格式化为符合请求要求的字符串即可 eg:name=val&name=val...
     *  另外需要设置请求头格式 setRequestHeader，需要放在open()及send()中间
     */
    if (method == "GET") {
        url = pathAdd(data, method, url);
        xmlhttp.open(method, url, async);
    } else {
        data = pathAdd(data, method, url);
        xmlhttp.open(method, url, async);
        xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    }
    //发送请求到服务器
    //data 根据请求方式不同而有不同的值  GET：null POST:字符串
    xmlhttp.send(data);
    if (async) {
        //如果是异步请求  需要监听服务器响应状态
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {
                if (xmlhttp.status == 200) {
                    //如果响应成功并返回数据 调用success回调函数 并返回响应数据
                    success(xmlhttp.responseText);
                } else {
                    //如果响应失败，调用error回调函数，并返回失败状态码
                    error("ajax请求出错，状态码：" + xmlhttp.status);
                }
            }
        }
    } else {
        //如果同步请求  直接使用responseText来得到响应数据 或 返回对应错误码
        if (xmlhttp.status == 200) {
            success(xmlhttp.responseText);
        } else {
            error("ajax请求出错，状态码：" + xmlhttp.status);
        }

    }
}
/**
 * 拼接参数
 *data:需要拼接的参数对象
 *method:请求类型
 *url : 请求地址
 *返回：GET模式下 返回 url?name=val&name=val; URL地址
 *POST模式下 返回 name=val&name=val;  字符串
 */
function pathAdd(data, method, url) {
    var arr = [];
    //遍历传入的data对象，将键、值以等号连接，存入一个数组
    for (var key in data) {
        arr.push(key + "=" + data[key]);
    }
    //使用Join方法 将数组 转换成 符合http请求的字符串格式
    var str = arr.join("&");
    //如果是GET请求 返回 完整的URL地址+？+参数字符串
    //否则，直接返回参数字符串
    if (method == "GET") {
        return url + "?" + str;
    } else {
        return str;
    }
}
